AWS CLI を用いて Amazon CloudWatch Logs ロググループのタグ値を一括変更してみた
AWS のタグエディタには対応していないリソースがあり、その 1 つが Amazon CloudWatch Logs ロググループです。ロググループに付与されている特定のタグの値を一括で変更したく、コマンドを検討したためブログにします。
ユースケースとしては、ABAC 用のタグの値を一括変更したい場合などがあります。少し特殊な方法ですが、ロググループの ABAC については次のブログでも紹介しています。
なお、タグエディタの対応リソースは次のドキュメントで確認できます。
CloudWatch Logs ロググループのタグ値の一括変更
次のコマンドで、キー名が TAG_KEY
のタグ値を OLD_TAG_VALUE
から NEW_TAG_VALUE
に変更します。下記の変数の値の場合は、Project: aaa
を Project: zzz
に変更します。
TAG_KEY="Project"
OLD_TAG_VALUE="aaa"
NEW_TAG_VALUE="zzz"
AWS_REGION="ap-northeast-1"
aws logs describe-log-groups --region "${AWS_REGION}" --query "logGroups[].[arn]" --output text \
| while read arn; do
echo "### ${arn}"
tag_value=$(aws logs list-tags-for-resource --resource-arn $(echo ${arn} | sed 's/:\*//') --query "tags.${TAG_KEY}" --output text)
if [ ${tag_value} = ${OLD_TAG_VALUE} ]; then
aws logs tag-resource --resource-arn $(echo ${arn} | sed 's/:\*//') --tags "${TAG_KEY}"="${NEW_TAG_VALUE}"
echo "Updated \"${TAG_KEY}\" tag value from \"${OLD_TAG_VALUE}\" to \"${NEW_TAG_VALUE}\""
else
echo "No update \"${TAG_KEY}\" tag value"
fi
done
コマンドの実行結果例
下表のテスト用データに対してコマンドを実行してみます。
CloudWatch ロググループ | Project タグ |
---|---|
/test/abac/log-01 | Project: aaa |
/test/abac/log-02 | Project: aaa |
/test/abac/log-03 | Project: bbb |
/test/abac/log-04 | Project: bbb |
/test/abac/log-05 | タグなし |
コマンドの実行結果例です。タグ値を変更したロググループは Updated "Project" tag value from "aaa" to "zzz"
と出力され、タグ値を変更していないロググループは No update "Project" tag value
と出力されています。
$ TAG_KEY="Project"
$ OLD_TAG_VALUE="aaa"
$ NEW_TAG_VALUE="zzz"
$ AWS_REGION="ap-northeast-1"
$ aws logs describe-log-groups --region "${AWS_REGION}" --query "logGroups[].[arn]" --output text \
> | while read arn; do
> echo "### ${arn}"
> tag_value=$(aws logs list-tags-for-resource --resource-arn $(echo ${arn} | sed 's/:\*//') --query "tags.${TAG_KEY}" --output text)
> if [ ${tag_value} = ${OLD_TAG_VALUE} ]; then
> aws logs tag-resource --resource-arn $(echo ${arn} | sed 's/:\*//') --tags "${TAG_KEY}"="${NEW_TAG_VALUE}"
> echo "Updated \"${TAG_KEY}\" tag value from \"${OLD_TAG_VALUE}\" to \"${NEW_TAG_VALUE}\""
> else
> echo "No update \"${TAG_KEY}\" tag value"
> fi
> done
### arn:aws:logs:ap-northeast-1:111122223333:log-group:/test/abac/log-01:*
Updated "Project" tag value from "aaa" to "zzz"
### arn:aws:logs:ap-northeast-1:111122223333:log-group:/test/abac/log-02:*
Updated "Project" tag value from "aaa" to "zzz"
### arn:aws:logs:ap-northeast-1:111122223333:log-group:/test/abac/log-03:*
No update "Project" tag value
### arn:aws:logs:ap-northeast-1:111122223333:log-group:/test/abac/log-04:*
No update "Project" tag value
### arn:aws:logs:ap-northeast-1:111122223333:log-group:/test/abac/log-05:*
No update "Project" tag value
タグ値が変更されたロググループと変更されていないロググループを確認した結果をいくつか掲載します。
タグ値が変更された /test/abac/log-01
の確認結果です。zzz
に変更されています。
$ aws logs list-tags-for-resource --resource-arn arn:aws:logs:ap-northeast-1:111122223333:log-group:/test/abac/log-01
{
"tags": {
"Project": "zzz"
}
}
タグ値が変更されていない /test/abac/log-03
の確認結果です。bbb
のままです。
$ aws logs list-tags-for-resource --resource-arn arn:aws:logs:ap-northeast-1:111122223333:log-group:/test/abac/log-03
{
"tags": {
"Project": "bbb"
}
}
指定したタグが存在していなかった /test/abac/log-05
の確認結果です。タグなしのままです。
$ aws logs list-tags-for-resource --resource-arn arn:aws:logs:ap-northeast-1:111122223333:log-group:/test/abac/log-05
{
"tags": {}
}
コマンドの実行内容
コマンドの実行内容は次の流れとなります。
- ロググループの一覧を取得
- 各ロググループに対して
TAG_KEY
タグの値を確認 TAG_KEY
タグの値がOLD_TAG_VALUE
の場合はNEW_TAG_VALUE
に変更
describe-log-groups
コマンドで取得した ARN は最後に :*
が付与されており、このまま list-tags-for-resource
コマンドで指定するとエラーとなります。
arn:aws:logs:ap-northeast-1:111122223333:log-group:/test/abac/log-01:*
そのため、タグ関連のコマンドを実行するときは sed
コマンドで :*
を除外しています。
テスト用ロググループを作成するコマンド
参考情報として今回のテスト用に用意していたロググループを作成するコマンドを掲載します。
aws logs create-log-group \
--log-group-name /test/abac/log-01 \
--tags Project=aaa
aws logs create-log-group \
--log-group-name /test/abac/log-02 \
--tags Project=aaa
aws logs create-log-group \
--log-group-name /test/abac/log-03 \
--tags Project=bbb
aws logs create-log-group \
--log-group-name /test/abac/log-04 \
--tags Project=bbb
aws logs create-log-group \
--log-group-name /test/abac/log-05
さいごに
タグエディタが対応していないリソースの 1 つである Amazon CloudWatch Logs ロググループのタグ値を一括変更したく、AWS CLI を用いて試してみました。なお、タグエディタに対応しているリソースは簡単に一括変更ができます。
以上、このブログがどなたかのご参考になれば幸いです。